/**
 * describe:
 *
 * @author chaP
 * @date 2019/03/09
 */
package CodingTest.AC20190309;

import java.util.ArrayList;

/**
 * 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。
 * HF作为牛客的资深元老,自然也准备了一些小游戏。
 * 其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,
 * 让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,
 * 并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,
 * 可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢？
 * (注：小朋友的编号是从0到n-1)
 */
public class LastRemaining_Solution {
    //解法一：
    public int LastRemaining_Solution1(int n,int m){
        int a[] = new int[n];
        int i = -1,step = 0,count = n;//step表示已经走过的步数
        while(count > 0){//跳出循环时将最后一个元素也设置为了-1
            i++;   //指向上一个被删除对象的下一个元素。
            if(i == n) i = 0;//模拟环
            if(a[i] == -1) continue; // 如果该人已经被选出 则从下一个循环
            step ++;
            if(step == m){
                a[i] = -1;
                count --;
                step = 0;

            }
        }
        return i;

    }
    //解法二：使用动态数组模拟，这是最先想到的方法
    public int LastRemaining_Solution2(int n,int m){
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i = 0;i<n;i++){
            list.add(i);
        }
        int index = -1;
        while(list.size()>1){
            index = (index + m)%list.size();
            list.remove(index);
            index --;
        }
        return list.get(0);

    }

    public static void main(String[] args) {
        LastRemaining_Solution ls = new LastRemaining_Solution();
        System.out.println(ls.LastRemaining_Solution2(5,3));
    }
}

